# python一元回归分析实例：预测细菌的繁殖个数
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np


# 从csv文件中读取数据，分别为：X列表和对应的Y列表
def get_data(file_name):
    # 1. 用pandas读取csv
    data = pd.read_csv(file_name)

    # 2. 构造X列表和Y列表
    X_parameter = []
    Y_parameter = []
    for single_day, single_lnnum_value in zip(data['day'], data['lnnum']):
        X_parameter.append([float(single_day)])
        Y_parameter.append(float(single_lnnum_value))
    return X_parameter, Y_parameter


# 线性回归分析，其中predict_day为时间天数，函数返回对应的细菌的繁殖个数
def linear_model_main(X_parameter, Y_parameter, predict_day):
    # 1. 构造回归对象
    regr = LinearRegression()
    regr.fit(X_parameter, Y_parameter)

    # 2. 获取预测值
    predict_outcome = regr.predict([[predict_day]])

    # 3. 构造返回字典
    predictions = {}

    # 3.1 截距值
    predictions['intercept'] = regr.intercept_

    # 3.2 回归系数（斜率值）
    predictions['coefficient'] = regr.coef_

    # 3.3 预测值
    predictions['predict_value'] = np.exp(predict_outcome)
    return predictions


# 绘出图像
def show_linear_line(X_parameter, Y_parameter):
    # 1. 构造回归对象
    regr = LinearRegression()
    regr.fit(X_parameter, Y_parameter)

    # 2. 绘出已知数据散点图
    plt.scatter(X_parameter, Y_parameter, color='blue')

    # 3. 绘出预测直线
    plt.plot(X_parameter, regr.predict(X_parameter), color='red', linewidth=4)
    plt.title('Predict the lnnum of bacteria')
    plt.xlabel('day')
    plt.ylabel('lnnum')
    plt.show()


# 主函数
def main():
    # 1. 读取数据
    X, Y = get_data('D:\\mathorCup\\bacteria.csv')

    # 2. 获取预测值，在这里我们预测第100天细菌的繁殖个数
    predict_day = 100
    result = linear_model_main(X, Y, predict_day)
    for key, value in result.items(): print('{0}:{1}'.format(key, value))

    # 3. 绘图
    show_linear_line(X, Y)


if __name__ == '__main__':
    main()
